package xkp.lesson2;

import xkp.lesson1.Person;

class Info<T>{
    private T var ;        // 定义泛型变量
    public void setVar(T var){
        this.var = var ;
    }
    public T getVar(){
        return this.var ;
    }
    public String toString(){    // 直接打印
        return this.var.toString() ;
    }
};

public class Demo1{
    public static void main(String args[]){
        Info<String> i = new Info<String>();        // 使用String为泛型类型
        i.setVar("新开普");                            // 设置内容
        fun(i);   //把String泛型类型的i对象传递给Object泛型类型的temp。
        //fun2(i);
        
        Info<Person> infoP = new Info<Person>();
        infoP.setVar(new Person(20, "张三"));
        fun(infoP);
        fun2(infoP);
        fun3(infoP);
        
        Info<Object> infoObj = new Info<Object>();
        fun(infoObj);
        //fun2(infoObj);
        fun3(infoObj);
     }
    //此处会有问题
    //Object的引用可以指向子类对象
    //Info<String>类型与Info<Object>类型不匹配
    //Info<String>类型与Info<Object>类型不存在继承关系，是两个不相干的类型
	/*
	 * public static void fun(Info<Object> i){ // 接收Object泛型类型的Info对象
	 * System.out.println("内容：" + i) ; }
	 */
    
    //?号是通配符,可以完美的接收Info<T>
    //?通配符只解决了接收参数问题，但是没有解决设置参数问题
    //
    public static void fun(Info<?> i){        // 接收Object泛型类型的Info对象
        System.out.println("内容：" + i);
        //如果设置值会出现问题
    }
    
    //只接受Person或者Person的子类
    public static void fun2(Info<? extends Person> i){        
        System.out.println("内容：" + i);
      
        //如果设置值会出现问题
    }
    
    //只接受Person或者Person的父类
    public static void fun3(Info<? super Person> i){        // 接收Object泛型类型的Info对象
        System.out.println("内容：" + i);
      
        //如果设置值会出现问题
    }
    
    //目前使用？范围太大，没有办法做类型检查，能不设置一个范围
    //设置上限：必须是谁的子类
};